using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.ComponentModel.DataAnnotations;

namespace JGSY.CMS.LowCode.Platform.Application.DTOs
{
    /// <summary>
    /// 分类数据传输对象
    /// </summary>
    /// <remarks>
    /// 分类是内容管理系统的核心概念，用于组织和分类各种内容。
    /// 支持无限层级的树形结构，每个分类可以包含子分类和内容项。
    /// 
    /// <para><strong>使用场景:</strong></para>
    /// <list type="bullet">
    /// <item>文章分类管理</item>
    /// <item>产品类目管理</item>
    /// <item>媒体文件分组</item>
    /// <item>页面组织结构</item>
    /// </list>
    /// </remarks>
    public class CategoryDto
    {
        /// <summary>
        /// 分类唯一标识符
        /// </summary>
        /// <example>1</example>
        [JsonPropertyName("id")]
        public long Id { get; set; }
        
        /// <summary>
        /// 分类名称
        /// </summary>
        /// <remarks>
        /// 分类的显示名称，用于在界面上展示给用户。
        /// 在同一父分类下，分类名称必须唯一。
        /// </remarks>
        /// <example>技术文章</example>
        [JsonPropertyName("name")]
        [Required(ErrorMessage = "分类名称不能为空")]
        [StringLength(100, ErrorMessage = "分类名称长度不能超过100个字符")]
        public string Name { get; set; } = string.Empty;

        /// <summary>
        /// 分类别名/URL slug
        /// </summary>
        /// <remarks>
        /// 用于生成SEO友好的URL，通常为英文或数字，用连字符分隔。
        /// 如果为空，系统会根据分类名称自动生成。
        /// </remarks>
        /// <example>tech-articles</example>
        [JsonPropertyName("slug")]
        [StringLength(200, ErrorMessage = "分类别名长度不能超过200个字符")]
        [RegularExpression("^[a-z0-9-]+$", ErrorMessage = "分类别名只能包含小写字母、数字和连字符")]
        public string? Slug { get; set; }
        
        /// <summary>
        /// 分类描述
        /// </summary>
        /// <remarks>
        /// 对分类的详细说明，帮助用户理解分类的用途和内容范围。
        /// 支持HTML标记，可用于SEO优化。
        /// </remarks>
        /// <example>包含技术相关的文章内容，如编程教程、技术分享等</example>
        [JsonPropertyName("description")]
        [StringLength(1000, ErrorMessage = "分类描述长度不能超过1000个字符")]
        public string? Description { get; set; }
        
        /// <summary>
        /// 分类类型
        /// </summary>
        /// <remarks>
        /// 用于区分不同用途的分类，常见类型：
        /// <list type="bullet">
        /// <item><c>article</c> - 文章分类</item>
        /// <item><c>product</c> - 产品分类</item>
        /// <item><c>page</c> - 页面分类</item>
        /// <item><c>media</c> - 媒体分类</item>
        /// <item><c>custom</c> - 自定义分类</item>
        /// </list>
        /// </remarks>
        /// <example>article</example>
        [JsonPropertyName("type")]
        [Required(ErrorMessage = "分类类型不能为空")]
        [StringLength(50, ErrorMessage = "分类类型长度不能超过50个字符")]
        public string Type { get; set; } = string.Empty;
        
        /// <summary>
        /// 父分类ID
        /// </summary>
        /// <remarks>
        /// 指向父分类的外键，null表示这是一个根级分类。
        /// 通过父子关系构建树形层级结构。
        /// </remarks>
        /// <example>null</example>
        [JsonPropertyName("parentId")]
        public long? ParentId { get; set; }
        
        /// <summary>
        /// 父分类名称
        /// </summary>
        /// <remarks>
        /// 父分类的名称，用于显示层级关系。
        /// 只在需要显示父级信息时包含此字段。
        /// </remarks>
        /// <example>技术文档</example>
        [JsonPropertyName("parentName")]
        public string? ParentName { get; set; }
        
        /// <summary>
        /// 分类层级路径
        /// </summary>
        /// <remarks>
        /// 从根分类到当前分类的完整路径，用斜杠分隔。
        /// 用于显示分类的完整层级关系，系统自动维护。
        /// </remarks>
        /// <example>/技术/前端/React</example>
        [JsonPropertyName("path")]
        public string? Path { get; set; }
        
        /// <summary>
        /// 层级深度
        /// </summary>
        public int Level { get; set; }
        
        /// <summary>
        /// 排序权重
        /// </summary>
        public int SortWeight { get; set; }

        /// <summary>
        /// 排序序号
        /// </summary>
        public int SortOrder { get; set; }
        
        /// <summary>
        /// 分类图标
        /// </summary>
        public string? Icon { get; set; }
        
        /// <summary>
        /// 分类封面图
        /// </summary>
        public string? CoverImage { get; set; }
        
        /// <summary>
        /// 分类颜色
        /// </summary>
        public string? Color { get; set; }
        
        /// <summary>
        /// 是否启用
        /// </summary>
        public bool IsEnabled { get; set; } = true;

        /// <summary>
        /// 是否激活
        /// </summary>
        public bool IsActive { get; set; } = true;
        
        /// <summary>
        /// 是否在导航中显示
        /// </summary>
        public bool ShowInNavigation { get; set; } = true;
        
        /// <summary>
        /// 子分类数量
        /// </summary>
        public int ChildrenCount { get; set; }
        
        /// <summary>
        /// 内容数量
        /// </summary>
        public int ContentCount { get; set; }
        
        /// <summary>
        /// SEO标题
        /// </summary>
        public string? SeoTitle { get; set; }
        
        /// <summary>
        /// SEO关键词
        /// </summary>
        public string? SeoKeywords { get; set; }
        
        /// <summary>
        /// SEO描述
        /// </summary>
        public string? SeoDescription { get; set; }
        
        /// <summary>
        /// 自定义标签 (JSON格式)
        /// </summary>
        public string? Tags { get; set; }
        
        /// <summary>
        /// 版本号
        /// </summary>
        public string Version { get; set; } = "1.0.0";
        
        /// <summary>
        /// 状态
        /// </summary>
        public string Status { get; set; } = "Active";
        
        /// <summary>
        /// 创建者ID
        /// </summary>
        public long? CreatedById { get; set; }
        
        /// <summary>
        /// 创建者姓名
        /// </summary>
        public string? CreatedByName { get; set; }
        
        /// <summary>
        /// 更新者ID
        /// </summary>
        public long? UpdatedById { get; set; }
        
        /// <summary>
        /// 更新者姓名
        /// </summary>
        public string? UpdatedByName { get; set; }
        
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreatedAt { get; set; }
        
        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime? UpdatedAt { get; set; }
        
        /// <summary>
        /// 子分类列表
        /// </summary>
        public List<CategoryDto>? Children { get; set; }
        
        /// <summary>
        /// 扩展属性 (JSON格式)
        /// </summary>
        public string? ExtendedProperties { get; set; }
    }
}
